/**
 * 全局复用的自定义hooks函数
 * 封装规范：本质上是一个普通函数
 * 1. 函数命名以use开头：useXxx
 * 2. 函数体内：用组合式api写的要复用的js代码
 * 3. 函数体内：对外提供的变量或方法需要返回
 * 注意：不能在函数内放全局宏函数，例如：父子通信的defineProps、defineEmites
 */
import type { FollowType, DoctorList } from '@/types/consult'
import { followDoctor, getDoctorPage, getPrescriptionPic } from '@/api/consult'
import { ref, onMounted } from 'vue'
import { showImagePreview } from 'vant'
import { useRoute } from 'vue-router'
import type { OrderDetail } from '@/types/medicine'
import { getMedicalOrderDetail } from '@/api/medicine'

export const useFollow = (type: FollowType) => {
  // 关注逻辑
  const loading = ref(false)
  /**
   *
   * @param doc 关注医生 ｜ 关注一篇文章
   */
  // 说明：doc参数类型只保留通用的类型=> 多的类型可以传给少的
  const follow = async (doc: { id: string; likeFlag: 0 | 1 }) => {
    // 显示loading，防止重复点击
    loading.value = true
    try {
      // 1. 修改数据库关注状态
      await followDoctor(doc.id, type)
      // 2. 修改前端关注状态=》取反
      doc.likeFlag = doc.likeFlag === 1 ? 0 : 1
    } finally {
      // 无论 try / catch 结果如何都会执行的代码块
      loading.value = false
    }
  }

  return { loading, follow }
}

export const useDocList = () => {
  // 写法1
  const list = ref<DoctorList>([])
  const getList = async () => {
    const { rows } = await getDoctorPage({ current: 1, pageSize: 5 })
    console.log('医生列表：', rows)
    list.value = rows
  }
  onMounted(() => {
    getList()
  })
  // 写法2
  // 立即执行表达式IIFE
  // ;(async () => {
  //   const { rows } = await getDoctorPage({ current: 1, pageSize: 5 })
  //   console.log('医生列表：', rows)
  // })()

  return { list, getList }
}
/**
 * 查看电子处方单
 * @returns
 */
export const usePre = () => {
  const previewPre = async (id?: string) => {
    if (id) {
      // 1. 调用api函数
      const { url } = await getPrescriptionPic(id)
      // 2. 使用showImagePreview预览处方单
      showImagePreview([url])
    }
  }

  return { previewPre }
}
/**
 * 药品订单详情
 */
export const useMedicine = () => {
  const route = useRoute()
  const order = ref<OrderDetail>()
  onMounted(async () => {
    const res = await getMedicalOrderDetail(route.query.orderId as string)
    order.value = res
    console.log('药品订单详情：', res)
  })

  return { order }
}
